package com.yy.utils;

import com.yy.enums.ResultEnum;
import lombok.Data;

/**
 * @author young
 * @date 2022/12/14 16:56
 * @description: 统一返回值类
 */
@Data
public class Result<T> {
    /**
     * 返回码
     */
    private Integer code;
    /**
     * 返回消息结果
     */
    private String message;
    /**
     * 返回数据
     */
    private T data;
    /**
     * 返回类型
     */
    private String type;
    private Result(){}

    /**
     * 获取数据
     * @param data
     * @return
     * @param <T>
     */
    public static <T> Result<T> build(T data){
        Result<T> result = new Result<>();
        if (data != null){
            result.setData(data);
        }return result;
    }

    /**
     * 自定义枚举类获取对应数据
     * @param data data
     * @param resultEnum resultEnum
     * @return
     * @param <T> 
     */
    public static <T> Result<T> build(T data, ResultEnum resultEnum){
        Result<T> result = build(data);
        result.setCode(resultEnum.getCode());
        result.setMessage(resultEnum.getMsg());
        result.setType(resultEnum.getType());
        return result;
    }

    /**
     * 有数据返回成功
     * @param data
     * @return
     * @param <T>
     */
    public static <T> Result<T> ok(T data){
       return build(data, ResultEnum.SUCCESS);
    }

    /**
     * 无数据返回成功
     * @return
     * @param <T>
     */
    public static <T> Result<T> ok(){
        return Result.ok(null);
    }

    /**
     * 有数据返回失败
     * @param data
     * @return
     * @param <T>
     */
    public static <T> Result<T> fail(T data){
        return build(data, ResultEnum.FAIL);
    }

    /**
     * 无数据返回失败
     * @return
     * @param <T>
     */
    public static <T> Result<T> fail(){
        return Result.fail(null);
    }

    /**
     * 自定义返回消息
     * @param message
     * @return
     */
    public  Result<T> message(String message){
        this.message = message;
        return this;
    }

    /**
     * 自定义返回码
     * @param code
     * @return
     */
    public Result<T> code(Integer code){
        this.code = code;
        return this;
    }
}
